home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok82.lha / Mini / txt / Scanner.mod < prev    next >
Text File  |  1993-08-15  |  2KB  |  64 lines

  1. MODULE Scanner;
  2.  
  3. IMPORT F := FileSystem, R := Requests;
  4.  
  5. CONST
  6.   program * =  0; var    * =  1; begin  * =  2;   (* Symbole von Mini *)
  7.   end     * =  3; while  * =  4; do     * =  5;
  8.   print   * =  6; comma  * =  7; equal  * =  8;
  9.   plus    * =  9; minus  * = 10; ident  * = 11;
  10.   const   * = 12; eof    * = 13;
  11.  
  12.   MaxIdLen * = 79;
  13.  
  14. TYPE Identifier * = ARRAY MaxIdLen+1 OF CHAR;
  15.  
  16. VAR
  17.   source    * : F.File;     (* Quelltextdatei                         *)
  18.   char        : CHAR;       (* zuletzt gelesenes Zeichen (0X bei EOF) *)
  19.   sym       - : INTEGER;    (* das letzte Symbol (program, var, etc.) *)
  20.   identifier- : Identifier; (* der Bezeichner bei sym=ident           *)
  21.   constant  - : LONGINT;    (* die Konstante bei sym=const            *)
  22.  
  23. PROCEDURE GetChar;
  24. BEGIN IF ~ F.Read(source,char) THEN char := 0X END END GetChar;
  25.  
  26. PROCEDURE GetSym*;
  27. VAR i: INTEGER;
  28. BEGIN
  29.   WHILE (char>0X) & (char<=" ") DO GetChar END;    (* Space, LF, etc. *)
  30.   CASE CAP(char) OF
  31.   | "A".."Z":                        (* Bezeichner oder Schlüsselwort *)
  32.       i := 0;
  33.       REPEAT
  34.         identifier[i] := char;
  35.         INC(i);
  36.         GetChar;
  37.       UNTIL (i=MaxIdLen) OR (CAP(char)<"A") OR (CAP(char)>"Z");
  38.       identifier[i] := 0X;
  39.       IF    identifier = "PROGRAM" THEN sym := program
  40.       ELSIF identifier = "VAR"     THEN sym := var
  41.       ELSIF identifier = "BEGIN"   THEN sym := begin
  42.       ELSIF identifier = "END"     THEN sym := end
  43.       ELSIF identifier = "WHILE"   THEN sym := while
  44.       ELSIF identifier = "DO"      THEN sym := do
  45.       ELSIF identifier = "PRINT"   THEN sym := print
  46.       ELSE
  47.         sym := ident;          (* Kein Schlüsselwort, also Bezeichner *)
  48.       END;
  49.   | "0".."9":                                       (* Konstante Zahl *)
  50.       constant := 0;
  51.       REPEAT
  52.         constant := 10*constant + ORD(char) - ORD("0"); GetChar;
  53.       UNTIL (char<"0") OR (char>"9");
  54.       sym := const;
  55.   | "=": sym := equal; GetChar;                      (* Sonderzeichen *)
  56.   | ",": sym := comma; GetChar;
  57.   | "+": sym := plus ; GetChar;
  58.   | "-": sym := minus; GetChar;
  59.   | 0X : sym := eof;
  60.   ELSE R.Fail("Unerwartetes Zeichen!") END;
  61. END GetSym;
  62.  
  63. BEGIN char := " " END Scanner.
  64.